import 'package:flutter/material.dart';
import 'package:petitparser/petitparser.dart';

///上下文文敏感解析，可以使用 Parser.callCC 方法来改变解析的行为。
///创建一个解析器，它期望看到一个 'a'，然后用 callCC 改变解析的行为
///如果解析成功，我们改变解析的结果，将结果字符串翻倍
class ESensitiveParser extends StatefulWidget {
  const ESensitiveParser({super.key});

  @override
  State<ESensitiveParser> createState() => _ESensitiveParserState();
}

class _ESensitiveParserState extends State<ESensitiveParser> {
  var resultStr = '';
  final invalidStr = 'Invalid input';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('上下文敏感解析'),
        ),
        body: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.all(16),
            child: Column(
              children: [
                Text('待解析数据"a"'),
                SizedBox(height: 10),
                TextButton(
                    onPressed: () {
                      _buildParser();
                      setState(() {});
                    },
                    child: Text('开始解析')),
                Text('解析结果："'),
                SizedBox(height: 10),
                Container(
                  color: const Color.fromARGB(255, 224, 224, 224),
                  child: Text(resultStr),
                ),
              ],
            ),
          ),
        ));
  }

  void _buildParser() {
    resultStr = '';
    // 创建一个解析器，它期望看到一个 'a'，然后用 callCC 改变解析的行为
    final parser = char('a').callCC((continuation, context) {
      // 获取原本应该解析的结果
      final result = continuation(context);

      // 如果解析成功，我们改变解析的结果，将结果字符串翻倍
      if (result.isSuccess) {
        return result.success(result.value + result.value, result.position);
      } else {
        return result;
      }
    });

    // 应该成功解析 "a"，并返回 "aa"
    final result = parser.parse('a');
    if (result.isSuccess) {
      resultStr = result.value;
      print('Parsed successfully: ${result.value}');
    } else {
      resultStr = 'Parse failed: ${result.message}';
      print('Parse failed: ${result.message}');
    }
  }
}
